const COMMON_JS = {
	/***
	 * @function
	 * @description 加载图片资源
	 * @param { string } url 图片地址
	 * 
	 * @returns { Promise } 
	 * @returns { UniApp.GetImageInfoSuccessData } success
	 * @returns { any } success
	 * 
	 * @todo returns注释完善
	 */
	loadImg: function(url) {
		return new Promise((resolve, reject) => {
			uni.getImageInfo({
				src: url,
				success: function(res) {
					resolve(res);
				},
				fail: function(res) {
					reject(res);
				},
			});
		});
		/*
		return new Promise((resolve, reject) => {
			let img = new Image();
			// img.crossOrigin = 'anonymous';
			// 跨域 直接用live server插件运行
			img.src = url;
			img.onload = () => {
				resolve(img);
			};
			img.onerror = reject;
		});
		*/
	},

	/**
	 * @description 防抖
	 * @param {Function} fn 需要执行的方法，因this指向问题，建议不使用箭头函数，
	 * @param {Number} delay 间隔时间，默认值100
	 * @param {Boolean} promptly 是否立即执行，默认false
	 * @link https://ext.dcloud.net.cn/plugin?id=6621
	 * **/
	debounce: (fn, delay = 100, promptly) => {
		let timer = null;
		return function(...args) {
			// 立即执行
			if (promptly) {
				// 当timer为null时执行
				if (!timer) fn.apply(this, args);
				if (timer) {
					clearTimeout(timer)
				}
				timer = setTimeout(() => {
					timer = null;
				}, delay)
			} else {
				if (timer) {
					clearTimeout(timer)
				}
				timer = setTimeout(() => {
					fn.apply(this, args);
				}, delay)
			}
		}
	},

	/**
	 * @description 节流
	 * @param {Function} fn 需要执行的方法，因this指向问题，建议不使用箭头函数，
	 * @param {Number} delay 间隔时间，默认值100
	 * @link https://ext.dcloud.net.cn/plugin?id=6621
	 * **/
	throttle: (fn, delay = 100) => {
		let valid = true;
		return function(...args) {
			if (!valid) {
				return
			}
			valid = false;
			fn.apply(this, args)
			setTimeout(() => {
				valid = true
			}, delay)
		}
	},

	/**
	 * @description JSON.stringify再封装，解决函数,undefined丢失问题.两函数搭配使用
	 * @param {Object|Array<any>} option 
	 * @link https://juejin.cn/post/7077487024474685470
	 * **/
	JSONStringify: (option) => {
		return JSON.stringify(option,
			(key, val) => {
				// 处理函数丢失问题
				if (typeof val === 'function') {
					return `${val}`;
				}
				// 处理undefined丢失问题
				if (typeof val === 'undefined') {
					return 'undefined';
				}
				return val;
			},
			2
		)
	},
	/**
	 * @description JSON.parse再封装，解决函数,undefined丢失问题.两函数搭配使用
	 * @param {string} objStr 
	 * @link https://juejin.cn/post/7077487024474685470
	 * **/
	JSONParse: (objStr) => {
		return JSON.parse(objStr, (k, v) => {
			if (typeof v === 'string' && v.indexOf && v.indexOf('function') > -1) {
				// eval 可能在eslint中报错，需要加入下行注释
				// eslint-disable-next-line
				return eval(`(function(){return ${v}})()`);
			}
			return v;
		});
	},
	/**
	 * @description 测试JSONParse，JSONStringify
	 * @link https://juejin.cn/post/7077487024474685470
	 * **/
	testJSONPS() {
		const obj = {
			a: null,
			b: 1,
			c: undefined,
			d: 'aaaa',
			e: true,
			f() {
				console.log('内容');
			}
		}
		// 序列化处理
		const JSONStr = COMMON_JS.JSONStringify(obj);
		console.log('序列化处理', JSONStr);
		// 序列化解析
		const JSONObj = COMMON_JS.JSONParse(JSONStr);
		console.log('解析序列化内容', JSONObj);

		// 深拷贝使用
		const obj2 = COMMON_JS.JSONParse(COMMON_JS.JSONStringify(obj));
		console.log('当前obj内容: ', obj);
	}
};
export default COMMON_JS;